Examining the 2014 Seattle and San Francisco summer crime data, as reported by the police, I noticed that San Francisco, despite having a population of less than 30 percent greater than the population of Seattle, had more than twice as many recorded cases of drug crime. Does this reflect a greater rate of use of certain drugs in San Francisco than in Seattle, or, rather, perhaps a difference in the manner of enforcement of drug laws or the manner in which reported infractions are recorded? Digging somewhat deeper—examining the data from 2013 through 2017 and on the use of certain popular drugs—I uncovered some striking trends and obtained some possible insight into these questions.

Examining the Seattle crime data from 2013 through 2017, one of the first things I noticed was a dramatic increase in the number of incidences of crime reflected in the police data. As the following plot of incidences of crime within some selected categories shows, the fractional increase in incidences of crime in the data is roughly the same across the various categories of crime.

San Francisco has seen no such increase. Furthermore, there is no evidence of the massive crime wave that this data would suggest, if the increase were taken to reflect the actual increase in crime. For example, there are reports of increased heroin use, but nothing close to the more than 100 percent increase in use, from one year to the next, that the data on drug crime in Seattle might seem to suggest. Are there significant differences, between the cities, in the relative rates of trafficking in drugs and of mere possession? Let’s look.

library(stringr)
seattle_drugs_13_17 <- seattle_complete %>%
  filter(Category == "Drugs" & Year %in% c(2013:2017))
SF_drugs_13_17 <- SF_complete %>%
  mutate(`Cited or Arrested` = (str_detect(Resolution, "ARREST") | 
                                str_detect(Resolution, "CITED"))) %>%
  filter(Category == "Drugs" & Year %in% c(2013:2017))
SF_drugs_13_17 <- SF_drugs_13_17 %>% 
  mutate(`Drug Offense Type` = 
          ifelse(str_detect(Descript, "LAB APPARATUS"), "Sales, Transportation, or Production",
              ifelse(str_detect(Descript, "POSSESSION"), "Possession",
              ifelse(str_detect(Descript, "SALE"), "Sales, Transportation, or Production",
              ifelse(str_detect(Descript, "TRANSPORT"), "Sales, Transportation, or Production",
              ifelse(str_detect(Descript, "PLANTING/CULTIVATING MARIJUANA"), 
                     "Sales, Transportation, or Production",
              "Other"
              ))))))
seattle_drugs_13_17 <- seattle_drugs_13_17 %>%
  mutate(`Drug Offense Type` = 
          ifelse(str_detect(`Offense Type`, "POSSESS"), "Possession",
              ifelse(str_detect(`Offense Type`, "FOUND"), "Possession",
              ifelse(str_detect(`Offense Type`, "DISTRIBUTE"), 
                     "Sales, Transportation, or Production",
              ifelse(str_detect(`Offense Type`, "SMUGGLE"), 
                     "Sales, Transportation, or Production",
              ifelse(str_detect(`Offense Type`, "PRODUCE"), 
                     "Sales, Transportation, or Production",
              ifelse(str_detect(`Offense Type`, "SELL"), 
                     "Sales, Transportation, or Production",
              ifelse(str_detect(`Offense Type`, "TRAFFIC"), 
                     "Sales, Transportation, or Production",
              "Other"))))))))
  
joined_counts <- (seattle_drugs_13_17 %>% count(Year, `Drug Offense Type`)) %>%
  left_join((SF_drugs_13_17 %>% count(Year, `Drug Offense Type`)), by = c("Year", "Drug Offense Type")) %>%
  gather(n.x, n.y, key = City, value = Incidents) %>%
  mutate(City = fct_recode(City,
                           Seattle = "n.x",
                           `San Francisco` = "n.y"))
#reformat some categories that will appear in the plot
joined_counts <- joined_counts %>% 
  mutate(`Drug Offense Type` = as.factor(`Drug Offense Type`)) %>%
  mutate(`Drug Offense Type` = 
           fct_recode(`Drug Offense Type`,
                      " Sales, Transportation,\nor Production" = "Sales, Transportation, or Production",
                      " Possession" = "Possession"))
plot <- ggplot(joined_counts %>% filter(`Drug Offense Type` != "Other")) +
  geom_col(aes(x = Year, y = Incidents, fill = City, color = `Drug Offense Type`),
                        position = "dodge") +
  theme(legend.title = element_blank()) +
  labs(x = "year", y = "count",
       title = "Drug-related Police Incidents: possession versus trafficking")
ggplotly(plot) %>% layout(margin = list(b = 50, l = 60, r = 10, t = 80))
seattle_drugs_13_17 <- seattle_drugs_13_17 %>%
  mutate(`Drug Type` = ifelse(str_detect(`Offense Type`, "MARIJU"), "Marijuana",    #yes
                            ifelse(str_detect(`Offense Type`, "METH"), "Methamphetamine",    #yes
                            ifelse(str_detect(`Offense Type`, "COCAINE"), "Cocaine",  #yes 
                            ifelse(str_detect(`Offense Type`, "HEROIN"), "Heroin",  #yes
                            ifelse(str_detect(`Offense Type`, "PRESCRIPTION"), "Prescription", #?
                            ifelse(str_detect(`Offense Type`, "PILL/TABLET"), "Pill/Tablet",  #?
                            ifelse(str_detect(`Offense Type`, "HALLUCINOGEN"), "Hallucinogen",
                            ifelse(str_detect(`Offense Type`, "SYNTHETIC"), "Synthetic",  #?
                            ifelse(str_detect(`Offense Type`, "AMPHETAMINE"), "Amphetamine", #yes
                            ifelse(str_detect(`Offense Type`, "OPIUM"), "Opium", #yes
                            ifelse(str_detect(`Offense Type`, "PARAPHENALIA"), "Paraphernalia", #yes
                            "Other")
                            )))))))))))
  
SF_drugs_13_17 <- SF_drugs_13_17 %>%
  mutate(`Drug Type` = ifelse(str_detect(Descript, "MARIJUANA"), "Marijuana",   #yes
                            ifelse(str_detect(Descript, "COCAINE"), "Cocaine",
                            ifelse(str_detect(Descript, "METH-AMPHETAMINE"), "Methamphetamine",
                            ifelse(str_detect(Descript, "BARBITUATES"), "Barbituates",
                            ifelse(str_detect(Descript, "CONTROLLED SUBSTANCE"), 
                                              "Controlled Substance",
                            ifelse(str_detect(Descript, "HALLUCINOGENIC"), "Hallucinogenic",
                            ifelse(str_detect(Descript, "AMPHETAMINE"), "Amphetamine", 
                            ifelse(str_detect(Descript, "METHADONE"), "Methadone",
                            ifelse(str_detect(Descript, "PARAPHERNALIA"), "Paraphernalia",
                            ifelse(str_detect(Descript, "OPIATES"), "Opiates",
                            ifelse(str_detect(Descript, "OPIUM"), "Opium",
                            ifelse(str_detect(Descript, "HEROIN"), "Heroin",
                            "Other")
                            ))))))))))))

ggplot(SF_drugs_13_17) +
  geom_bar(aes(`Drug Type`)) +
  labs(title = "San Francisco") +
  theme(axis.text.x = element_text(angle = 75, hjust = 1, vjust = 1))

seattle_selected_drugs <- seattle_drugs_13_17 %>%
  filter(`Drug Type` %in% c("Marijuana", "Cocaine", "Methamphetamine", "Heroin"))

SF_selected_drugs <- SF_drugs_13_17 %>%
  filter(`Drug Type` %in% c("Marijuana", "Cocaine", "Methamphetamine", "Heroin"))

ggplot(seattle_selected_drugs) +
  geom_bar(aes(`Drug Type`)) +
  labs(title = "Seattle") +
  theme(axis.text.x = element_text(angle = 65, hjust = 1, vjust = 1))

ggplot(SF_selected_drugs) +
  geom_bar(aes(`Drug Type`)) +
  labs(title = "San Francisco") +
  theme(axis.text.x = element_text(angle = 75, hjust = 1, vjust = 1))

joined_drug_counts <- (seattle_selected_drugs %>% count(Year, `Drug Type`)) %>%
  left_join((SF_selected_drugs %>% count(Year, `Drug Type`)), by = c("Year", "Drug Type"))
  
joined_drug_counts <- joined_drug_counts %>%
  rename(Seattle = n.x, `San Francisco` = n.y) %>%
  gather(Seattle, `San Francisco`, key = City, value = count)
  
plt <- ggplot(joined_drug_counts) + geom_col(aes(x = Year, y = count, fill = City, color = `Drug Type`), 
                                      position = "dodge")

ggplotly(plt) %>% layout(margin = list(b = 50, l = 60, r = 10, t = 80))
library(lubridate)
library(gridExtra)
#fig.height = 2, fig.width = 3
#seattle_drugs_13_17 <- seattle_drugs_13_17 %>%
#  mutate(R_date = floor_date(mdy_hms(`Occurred Date or Date Range Start`,
#                                     tz = "PST8PDT"), "day"))
#SF_drugs_13_17 <- SF_drugs_13_17 %>%
#  mutate(R_date = mdy(Date, tz = "PST8PDT"))
seattle_selected_drugs <- seattle_drugs_13_17 %>%
  filter(`Drug Type` %in% c("Marijuana", "Cocaine", "Methamphetamine", "Heroin"))
SF_selected_drugs <- SF_drugs_13_17 %>%
  filter(`Drug Type` %in% c("Marijuana", "Cocaine", "Methamphetamine", "Heroin"))
number_of_bins <- 78
plt_seattle_selected_drugs <- ggplot(seattle_selected_drugs) + 
  geom_freqpoly(aes(x = R_date, color = `Drug Type`), bins = number_of_bins) +
  scale_x_datetime(date_breaks = "4 months", 
                   limits = c(as.POSIXct("2012/12/31", tz = "PST8PDT"), 
                              as.POSIXct("2018/01/01", tz = "PST8PDT"))) +
  theme(axis.text.x = element_text(angle = 65, hjust = 1, vjust = 1)) +
  labs(y = "number per fortnight", x = "",
       title = "Seattle Police Incidents Related to 4 Popular Drugs",
       color = "Drug: ") +
  theme(legend.position = "bottom",
        plot.title = element_text(size = 9),
        axis.title.y = element_text(size = 8),
        axis.text.x = element_text(size = 6),
        legend.text = element_text(size = 6),
        legend.title = element_text(size = 8)) +
  guides(size = guide_legend(order = 2))
plt_SF_selected_drugs <- ggplot(SF_selected_drugs) +
  geom_freqpoly(aes(x = R_date, color = `Drug Type`), bins = number_of_bins) +
  scale_x_datetime(date_breaks = "4 months", 
                   limits = c(as.POSIXct("2012/12/31", tz = "PST8PDT"), 
                              as.POSIXct("2018/01/01", tz = "PST8PDT"))) +
  theme(axis.text.x = element_text(angle = 65, hjust = 1, vjust = 1)) +
  labs(y = "number per fortnight", x = "",
       title = "San Francisco Police Incidents Related to 4 Popular Drugs") +
  theme(legend.position = "none",
        plot.title = element_text(size = 9),
        axis.title.y = element_text(size = 8),
        axis.text.x = element_text(size = 6))
plt_seattle_all_13_17 <- seattle_complete %>% 
  filter(Year %in% 2013:2017) %>%
  ggplot(aes(x = R_date)) + geom_freqpoly(bins = number_of_bins) +
  scale_x_datetime(date_breaks = "4 months", 
                   limits = c(as.POSIXct("2012/12/31", tz = "PST8PDT"), 
                              as.POSIXct("2018/01/01", tz = "PST8PDT"))) +
  theme(axis.text.x = element_text(angle = 65, hjust = 1, vjust = 1)) +
  labs(y = "number per fortnight", x = "",
       title = "Seattle Police Incidents: 2013 through 2017") +
  theme(plot.title = element_text(size = 9),
        axis.title.y = element_text(size = 8),
        axis.text.x = element_text(size = 6))
plt_SF_all_13_17 <- SF_complete %>%
  filter(Year %in% 2013:2017) %>%
  ggplot(aes(x = R_date)) + geom_freqpoly(bins = number_of_bins) +
  scale_x_datetime(date_breaks = "4 months", 
                   limits = c(as.POSIXct("2012/12/31", tz = "PST8PDT"), 
                              as.POSIXct("2018/01/01", tz = "PST8PDT"))) +
  theme(axis.text.x = element_text(angle = 65, hjust = 1, vjust = 1)) +
  labs(y = "number per fortnight", x = "",
       title = "San Francisco Police Incidents: 2013 through 2017") +
  theme(plot.title = element_text(size = 9),
        axis.title.y = element_text(size = 8),
        axis.text.x = element_text(size = 6))
grid.arrange(plt_seattle_all_13_17, plt_SF_all_13_17, 
             plt_SF_selected_drugs, plt_seattle_selected_drugs,  
             layout_matrix = rbind(c(1, 2),
                                   c(4, 3),
                                   c(4, NA)),
             heights = c(5, 5, 1))

NA
LS0tCnRpdGxlOiAiRHJ1Z3MgYW5kIHRoZSBQb2xpY2U6IFNhbiBGcmFuY2lzY28gYW5kIFNlYXR0bGUiCmF1dGhvcjogIlN0dWFydCBCYXJudW0iCm91dHB1dDogaHRtbF9ub3RlYm9vawpkYXRlOiAyLzEyLzIwMTgKLS0tCgpFeGFtaW5pbmcgdGhlIDIwMTQgU2VhdHRsZSBhbmQgU2FuIEZyYW5jaXNjbyBzdW1tZXIgY3JpbWUgZGF0YSwgYXMgcmVwb3J0ZWQgYnkgdGhlIHBvbGljZSwgSSBub3RpY2VkIHRoYXQgU2FuIEZyYW5jaXNjbywgZGVzcGl0ZSBoYXZpbmcgYSBwb3B1bGF0aW9uIG9mIGxlc3MgdGhhbiAzMCBwZXJjZW50IGdyZWF0ZXIgdGhhbiB0aGUgcG9wdWxhdGlvbiBvZiBTZWF0dGxlLCBoYWQgbW9yZSB0aGFuIHR3aWNlIGFzIG1hbnkgcmVjb3JkZWQgY2FzZXMgb2YgZHJ1ZyBjcmltZS4gRG9lcyB0aGlzIHJlZmxlY3QgYSBncmVhdGVyIHJhdGUgb2YgdXNlIG9mIGNlcnRhaW4gZHJ1Z3MgaW4gU2FuIEZyYW5jaXNjbyB0aGFuIGluIFNlYXR0bGUsIG9yLCByYXRoZXIsIHBlcmhhcHMgYSBkaWZmZXJlbmNlIGluIHRoZSBtYW5uZXIgb2YgZW5mb3JjZW1lbnQgb2YgZHJ1ZyBsYXdzIG9yIHRoZSBtYW5uZXIgaW4gd2hpY2ggcmVwb3J0ZWQgaW5mcmFjdGlvbnMgYXJlIHJlY29yZGVkPyBEaWdnaW5nIHNvbWV3aGF0IGRlZXBlci0tLWV4YW1pbmluZyB0aGUgZGF0YSBmcm9tIDIwMTMgdGhyb3VnaCAyMDE3IGFuZCBvbiB0aGUgdXNlIG9mIGNlcnRhaW4gcG9wdWxhciBkcnVncy0tLUkgdW5jb3ZlcmVkIHNvbWUgc3RyaWtpbmcgdHJlbmRzIGFuZCBvYnRhaW5lZCBzb21lIHBvc3NpYmxlIGluc2lnaHQgaW50byB0aGVzZSBxdWVzdGlvbnMuCgpFeGFtaW5pbmcgdGhlIFNlYXR0bGUgY3JpbWUgZGF0YSBmcm9tIDIwMTMgdGhyb3VnaCAyMDE3LCBvbmUgb2YgdGhlIGZpcnN0IHRoaW5ncyBJIG5vdGljZWQgd2FzIGEgZHJhbWF0aWMgaW5jcmVhc2UgaW4gdGhlIG51bWJlciBvZiBpbmNpZGVuY2VzIG9mIGNyaW1lIHJlZmxlY3RlZCBpbiB0aGUgcG9saWNlIGRhdGEuIEFzIHRoZSBmb2xsb3dpbmcgcGxvdCBvZiBpbmNpZGVuY2VzIG9mIGNyaW1lIHdpdGhpbiBzb21lIHNlbGVjdGVkIGNhdGVnb3JpZXMgc2hvd3MsIHRoZSBmcmFjdGlvbmFsIGluY3JlYXNlIGluIGluY2lkZW5jZXMgb2YgY3JpbWUgaW4gdGhlIGRhdGEgaXMgcm91Z2hseSB0aGUgc2FtZSBhY3Jvc3MgdGhlIHZhcmlvdXMgY2F0ZWdvcmllcyBvZiBjcmltZS4KCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShwbG90bHkpCmxpYnJhcnkobHVicmlkYXRlKQoKU0ZfY29tcGxldGUgPC0gcmVhZF9jc3YoIlNGX0NvbXBsZXRlLmNzdiIpCnNlYXR0bGVfY29tcGxldGUgPC0gcmVhZF9jc3YoInNlYXR0bGVfY29tcGxldGUuY3N2IiwgZ3Vlc3NfbWF4ID0gMTAwMDAwKQojV2l0aCBndWVzcyBtYXggbGFyZ2UgZW5vdWdoLCBjb2x1bW5zIHRoYXQgY29udGFpbiBpbnRlZ2VycyB0aGF0IGV4Y2VlZCB0aGUgCiMzMi1iaXQgbWF4aW11bSBhcmUgcmVhZCBhcyBjaGFyYWN0ZXIgdmVjdG9ycy4KClNGX2NvbXBsZXRlIDwtIFNGX2NvbXBsZXRlICU+JQogIG11dGF0ZShZZWFyID0gYXMuaW50ZWdlcihzdHJfc3ViKERhdGUsIC00LCAtMSkpKSAlPiUKICBtdXRhdGUoQ2F0ZWdvcnkgPSBmY3RfcmVjb2RlKENhdGVnb3J5LAogICAgICAgICJEcnVncyIgPSAiRFJVRy9OQVJDT1RJQyIpKQoKc2VhdHRsZV9jb21wbGV0ZSA8LSBzZWF0dGxlX2NvbXBsZXRlICU+JQogIHJlbmFtZShDYXRlZ29yeSA9IGBTdW1tYXJpemVkIE9mZmVuc2UgRGVzY3JpcHRpb25gKSAlPiUKICBtdXRhdGUoQ2F0ZWdvcnkgPSBmY3RfcmVjb2RlKENhdGVnb3J5LAogICAgICAgICJQcm9zdGl0dXRpb24iID0gIlBST1NUSVRVVElPTiIsCiAgICAgICAgIkRydWdzIiA9ICJOQVJDT1RJQ1MiLAogICAgICAgICJXZWFwb25zIiA9ICJXRUFQT04iLAogICAgICAgICJMaXF1b3Jcbmxhd3MiID0gIkxJUVVPUiBWSU9MQVRJT04iLAogICAgICAgICJBc3NhdWx0IiA9ICJBU1NBVUxUIiwKICAgICAgICAiSG9taWNpZGUiID0gIkhPTUlDSURFIiwKICAgICAgICAiUm9iYmVyeSIgPSAiUk9CQkVSWSIsCiAgICAgICAgIlZlaGljbGVcbnRoZWZ0IiA9ICJWRUhJQ0xFIFRIRUZUIiwKICAgICAgICAiVGhlZnRcbmZyb21cbnZlaGljbGUiID0gIkNBUiBQUk9XTCIpKQoKc2VhdHRsZV9jb21wbGV0ZSA8LSBzZWF0dGxlX2NvbXBsZXRlICU+JQogIG11dGF0ZShSX2RhdGUgPSBmbG9vcl9kYXRlKG1keV9obXMoYE9jY3VycmVkIERhdGUgb3IgRGF0ZSBSYW5nZSBTdGFydGAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eiA9ICJQU1Q4UERUIiksICJkYXkiKSkKClNGX2NvbXBsZXRlIDwtIFNGX2NvbXBsZXRlICU+JQogIG11dGF0ZShSX2RhdGUgPSBtZHkoRGF0ZSwgdHogPSAiUFNUOFBEVCIpKQoKc2VhdHRsZV9jb21wbGV0ZSAlPiUKICBmaWx0ZXIoQ2F0ZWdvcnkgJWluJSAKICAgICAgICBjKCJQcm9zdGl0dXRpb24iLAogICAgICAgICJEcnVncyIsCiAgICAgICAgIldlYXBvbnMiLAogICAgICAgICJBc3NhdWx0IiwKICAgICAgICAiSG9taWNpZGUiLAogICAgICAgICJSb2JiZXJ5IiwKICAgICAgICAiVmVoaWNsZVxudGhlZnQiLAogICAgICAgICJUaGVmdFxuZnJvbVxudmVoaWNsZSIpKSAlPiUKICBmaWx0ZXIoWWVhciAlaW4lIDIwMTM6MjAxNykgJT4lCiAgZ2dwbG90KGFlcyh4ID0gQ2F0ZWdvcnksIGZpbGwgPSBhcy5mYWN0b3IoWWVhcikpKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgZ2d0aXRsZSgiUmVjb3JkZWQgQ2FzZXMgb2YgU2VsZWN0ZWQgQ2F0ZWdvcmllcyBvZiBDcmltZTogU2VhdHRsZSIpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIGxhYnMoZmlsbCA9ICJZZWFyIikKCmBgYApTYW4gRnJhbmNpc2NvIGhhcyBzZWVuIG5vIHN1Y2ggaW5jcmVhc2UuIEZ1cnRoZXJtb3JlLCB0aGVyZSBpcyBubyBldmlkZW5jZSBvZiB0aGUgbWFzc2l2ZSBjcmltZSB3YXZlIHRoYXQgdGhpcyBkYXRhIHdvdWxkIHN1Z2dlc3QsIGlmIHRoZSBpbmNyZWFzZSB3ZXJlIHRha2VuIHRvIHJlZmxlY3QgdGhlIGFjdHVhbCBpbmNyZWFzZSBpbiBjcmltZS4gRm9yIGV4YW1wbGUsIHRoZXJlIGFyZSByZXBvcnRzIG9mIGluY3JlYXNlZCBoZXJvaW4gdXNlLCBidXQgbm90aGluZyBjbG9zZSB0byB0aGUgbW9yZSB0aGFuIDEwMCBwZXJjZW50IGluY3JlYXNlIGluIHVzZSwgZnJvbSBvbmUgeWVhciB0byB0aGUgbmV4dCwgdGhhdCB0aGUgZGF0YSBvbiBkcnVnIGNyaW1lIGluIFNlYXR0bGUgbWlnaHQgc2VlbSB0byBzdWdnZXN0LiBBcmUgdGhlcmUgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMsIGJldHdlZW4gdGhlIGNpdGllcywgaW4gdGhlIHJlbGF0aXZlIHJhdGVzIG9mIHRyYWZmaWNraW5nIGluIGRydWdzIGFuZCBvZiBtZXJlIHBvc3Nlc3Npb24/IExldCdzIGxvb2suCgoKYGBge3IsIGZpZy5oZWlnaHQgPSA1LCBmaWcud2lkdGggPSAxMH0KbGlicmFyeShzdHJpbmdyKQoKc2VhdHRsZV9kcnVnc18xM18xNyA8LSBzZWF0dGxlX2NvbXBsZXRlICU+JQogIGZpbHRlcihDYXRlZ29yeSA9PSAiRHJ1Z3MiICYgWWVhciAlaW4lIGMoMjAxMzoyMDE3KSkKClNGX2RydWdzXzEzXzE3IDwtIFNGX2NvbXBsZXRlICU+JQogIG11dGF0ZShgQ2l0ZWQgb3IgQXJyZXN0ZWRgID0gKHN0cl9kZXRlY3QoUmVzb2x1dGlvbiwgIkFSUkVTVCIpIHwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChSZXNvbHV0aW9uLCAiQ0lURUQiKSkpICU+JQogIGZpbHRlcihDYXRlZ29yeSA9PSAiRHJ1Z3MiICYgWWVhciAlaW4lIGMoMjAxMzoyMDE3KSkKClNGX2RydWdzXzEzXzE3IDwtIFNGX2RydWdzXzEzXzE3ICU+JSAKICBtdXRhdGUoYERydWcgT2ZmZW5zZSBUeXBlYCA9IAogICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJMQUIgQVBQQVJBVFVTIiksICJTYWxlcywgVHJhbnNwb3J0YXRpb24sIG9yIFByb2R1Y3Rpb24iLAogICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiUE9TU0VTU0lPTiIpLCAiUG9zc2Vzc2lvbiIsCiAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJTQUxFIiksICJTYWxlcywgVHJhbnNwb3J0YXRpb24sIG9yIFByb2R1Y3Rpb24iLAogICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiVFJBTlNQT1JUIiksICJTYWxlcywgVHJhbnNwb3J0YXRpb24sIG9yIFByb2R1Y3Rpb24iLAogICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiUExBTlRJTkcvQ1VMVElWQVRJTkcgTUFSSUpVQU5BIiksIAogICAgICAgICAgICAgICAgICAgICAiU2FsZXMsIFRyYW5zcG9ydGF0aW9uLCBvciBQcm9kdWN0aW9uIiwKICAgICAgICAgICAgICAiT3RoZXIiCiAgICAgICAgICAgICAgKSkpKSkpCgpzZWF0dGxlX2RydWdzXzEzXzE3IDwtIHNlYXR0bGVfZHJ1Z3NfMTNfMTcgJT4lCiAgbXV0YXRlKGBEcnVnIE9mZmVuc2UgVHlwZWAgPSAKICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGBPZmZlbnNlIFR5cGVgLCAiUE9TU0VTUyIpLCAiUG9zc2Vzc2lvbiIsCiAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJGT1VORCIpLCAiUG9zc2Vzc2lvbiIsCiAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJESVNUUklCVVRFIiksIAogICAgICAgICAgICAgICAgICAgICAiU2FsZXMsIFRyYW5zcG9ydGF0aW9uLCBvciBQcm9kdWN0aW9uIiwKICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIlNNVUdHTEUiKSwgCiAgICAgICAgICAgICAgICAgICAgICJTYWxlcywgVHJhbnNwb3J0YXRpb24sIG9yIFByb2R1Y3Rpb24iLAogICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGBPZmZlbnNlIFR5cGVgLCAiUFJPRFVDRSIpLCAKICAgICAgICAgICAgICAgICAgICAgIlNhbGVzLCBUcmFuc3BvcnRhdGlvbiwgb3IgUHJvZHVjdGlvbiIsCiAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJTRUxMIiksIAogICAgICAgICAgICAgICAgICAgICAiU2FsZXMsIFRyYW5zcG9ydGF0aW9uLCBvciBQcm9kdWN0aW9uIiwKICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIlRSQUZGSUMiKSwgCiAgICAgICAgICAgICAgICAgICAgICJTYWxlcywgVHJhbnNwb3J0YXRpb24sIG9yIFByb2R1Y3Rpb24iLAogICAgICAgICAgICAgICJPdGhlciIpKSkpKSkpKQogIAoKam9pbmVkX2NvdW50cyA8LSAoc2VhdHRsZV9kcnVnc18xM18xNyAlPiUgY291bnQoWWVhciwgYERydWcgT2ZmZW5zZSBUeXBlYCkpICU+JQogIGxlZnRfam9pbigoU0ZfZHJ1Z3NfMTNfMTcgJT4lIGNvdW50KFllYXIsIGBEcnVnIE9mZmVuc2UgVHlwZWApKSwgYnkgPSBjKCJZZWFyIiwgIkRydWcgT2ZmZW5zZSBUeXBlIikpICU+JQogIGdhdGhlcihuLngsIG4ueSwga2V5ID0gQ2l0eSwgdmFsdWUgPSBJbmNpZGVudHMpICU+JQogIG11dGF0ZShDaXR5ID0gZmN0X3JlY29kZShDaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICBTZWF0dGxlID0gIm4ueCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGBTYW4gRnJhbmNpc2NvYCA9ICJuLnkiKSkKCiNyZWZvcm1hdCBzb21lIGNhdGVnb3JpZXMgdGhhdCB3aWxsIGFwcGVhciBpbiB0aGUgcGxvdApqb2luZWRfY291bnRzIDwtIGpvaW5lZF9jb3VudHMgJT4lIAogIG11dGF0ZShgRHJ1ZyBPZmZlbnNlIFR5cGVgID0gYXMuZmFjdG9yKGBEcnVnIE9mZmVuc2UgVHlwZWApKSAlPiUKICBtdXRhdGUoYERydWcgT2ZmZW5zZSBUeXBlYCA9IAogICAgICAgICAgIGZjdF9yZWNvZGUoYERydWcgT2ZmZW5zZSBUeXBlYCwKICAgICAgICAgICAgICAgICAgICAgICIgU2FsZXMsIFRyYW5zcG9ydGF0aW9uLFxub3IgUHJvZHVjdGlvbiIgPSAiU2FsZXMsIFRyYW5zcG9ydGF0aW9uLCBvciBQcm9kdWN0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICIgUG9zc2Vzc2lvbiIgPSAiUG9zc2Vzc2lvbiIpKQoKcGxvdCA8LSBnZ3Bsb3Qoam9pbmVkX2NvdW50cyAlPiUgZmlsdGVyKGBEcnVnIE9mZmVuc2UgVHlwZWAgIT0gIk90aGVyIikpICsKICBnZW9tX2NvbChhZXMoeCA9IFllYXIsIHkgPSBJbmNpZGVudHMsIGZpbGwgPSBDaXR5LCBjb2xvciA9IGBEcnVnIE9mZmVuc2UgVHlwZWApLAogICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsKICBsYWJzKHggPSAieWVhciIsIHkgPSAiY291bnQiLAogICAgICAgdGl0bGUgPSAiRHJ1Zy1yZWxhdGVkIFBvbGljZSBJbmNpZGVudHM6IHBvc3Nlc3Npb24gdmVyc3VzIHRyYWZmaWNraW5nIikKCmdncGxvdGx5KHBsb3QpICU+JSBsYXlvdXQobWFyZ2luID0gbGlzdChiID0gNTAsIGwgPSA2MCwgciA9IDEwLCB0ID0gODApKQpgYGAKCgpgYGB7ciwgZmlnLmhlaWdodCA9IDUsIGZpZy53aWR0aCA9IDEwfQpzZWF0dGxlX2RydWdzXzEzXzE3IDwtIHNlYXR0bGVfZHJ1Z3NfMTNfMTcgJT4lCiAgbXV0YXRlKGBEcnVnIFR5cGVgID0gaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJNQVJJSlUiKSwgIk1hcmlqdWFuYSIsICAgICN5ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGBPZmZlbnNlIFR5cGVgLCAiTUVUSCIpLCAiTWV0aGFtcGhldGFtaW5lIiwgICAgI3llcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJDT0NBSU5FIiksICJDb2NhaW5lIiwgICN5ZXMgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIkhFUk9JTiIpLCAiSGVyb2luIiwgICN5ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGBPZmZlbnNlIFR5cGVgLCAiUFJFU0NSSVBUSU9OIiksICJQcmVzY3JpcHRpb24iLCAjPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJQSUxML1RBQkxFVCIpLCAiUGlsbC9UYWJsZXQiLCAgIz8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGBPZmZlbnNlIFR5cGVgLCAiSEFMTFVDSU5PR0VOIiksICJIYWxsdWNpbm9nZW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJTWU5USEVUSUMiKSwgIlN5bnRoZXRpYyIsICAjPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJBTVBIRVRBTUlORSIpLCAiQW1waGV0YW1pbmUiLCAjeWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIk9QSVVNIiksICJPcGl1bSIsICN5ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGBPZmZlbnNlIFR5cGVgLCAiUEFSQVBIRU5BTElBIiksICJQYXJhcGhlcm5hbGlhIiwgI3llcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIk90aGVyIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpKSkpKSkpKSkpCiAgClNGX2RydWdzXzEzXzE3IDwtIFNGX2RydWdzXzEzXzE3ICU+JQogIG11dGF0ZShgRHJ1ZyBUeXBlYCA9IGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiTUFSSUpVQU5BIiksICJNYXJpanVhbmEiLCAgICN5ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiQ09DQUlORSIpLCAiQ29jYWluZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChEZXNjcmlwdCwgIk1FVEgtQU1QSEVUQU1JTkUiKSwgIk1ldGhhbXBoZXRhbWluZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChEZXNjcmlwdCwgIkJBUkJJVFVBVEVTIiksICJCYXJiaXR1YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChEZXNjcmlwdCwgIkNPTlRST0xMRUQgU1VCU1RBTkNFIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnRyb2xsZWQgU3Vic3RhbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiSEFMTFVDSU5PR0VOSUMiKSwgIkhhbGx1Y2lub2dlbmljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiQU1QSEVUQU1JTkUiKSwgIkFtcGhldGFtaW5lIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChEZXNjcmlwdCwgIk1FVEhBRE9ORSIpLCAiTWV0aGFkb25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiUEFSQVBIRVJOQUxJQSIpLCAiUGFyYXBoZXJuYWxpYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChEZXNjcmlwdCwgIk9QSUFURVMiKSwgIk9waWF0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJPUElVTSIpLCAiT3BpdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJIRVJPSU4iKSwgIkhlcm9pbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3RoZXIiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkpKSkpKSkpKSkpCgpnZ3Bsb3QoU0ZfZHJ1Z3NfMTNfMTcpICsKICBnZW9tX2JhcihhZXMoYERydWcgVHlwZWApKSArCiAgbGFicyh0aXRsZSA9ICJTYW4gRnJhbmNpc2NvIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNzUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkKCnNlYXR0bGVfc2VsZWN0ZWRfZHJ1Z3MgPC0gc2VhdHRsZV9kcnVnc18xM18xNyAlPiUKICBmaWx0ZXIoYERydWcgVHlwZWAgJWluJSBjKCJNYXJpanVhbmEiLCAiQ29jYWluZSIsICJNZXRoYW1waGV0YW1pbmUiLCAiSGVyb2luIikpCgpTRl9zZWxlY3RlZF9kcnVncyA8LSBTRl9kcnVnc18xM18xNyAlPiUKICBmaWx0ZXIoYERydWcgVHlwZWAgJWluJSBjKCJNYXJpanVhbmEiLCAiQ29jYWluZSIsICJNZXRoYW1waGV0YW1pbmUiLCAiSGVyb2luIikpCgpnZ3Bsb3Qoc2VhdHRsZV9zZWxlY3RlZF9kcnVncykgKwogIGdlb21fYmFyKGFlcyhgRHJ1ZyBUeXBlYCkpICsKICBsYWJzKHRpdGxlID0gIlNlYXR0bGUiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKQoKZ2dwbG90KFNGX3NlbGVjdGVkX2RydWdzKSArCiAgZ2VvbV9iYXIoYWVzKGBEcnVnIFR5cGVgKSkgKwogIGxhYnModGl0bGUgPSAiU2FuIEZyYW5jaXNjbyIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDc1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCgpqb2luZWRfZHJ1Z19jb3VudHMgPC0gKHNlYXR0bGVfc2VsZWN0ZWRfZHJ1Z3MgJT4lIGNvdW50KFllYXIsIGBEcnVnIFR5cGVgKSkgJT4lCiAgbGVmdF9qb2luKChTRl9zZWxlY3RlZF9kcnVncyAlPiUgY291bnQoWWVhciwgYERydWcgVHlwZWApKSwgYnkgPSBjKCJZZWFyIiwgIkRydWcgVHlwZSIpKQogIApqb2luZWRfZHJ1Z19jb3VudHMgPC0gam9pbmVkX2RydWdfY291bnRzICU+JQogIHJlbmFtZShTZWF0dGxlID0gbi54LCBgU2FuIEZyYW5jaXNjb2AgPSBuLnkpICU+JQogIGdhdGhlcihTZWF0dGxlLCBgU2FuIEZyYW5jaXNjb2AsIGtleSA9IENpdHksIHZhbHVlID0gY291bnQpCiAgCnBsdCA8LSBnZ3Bsb3Qoam9pbmVkX2RydWdfY291bnRzKSArIGdlb21fY29sKGFlcyh4ID0gWWVhciwgeSA9IGNvdW50LCBmaWxsID0gQ2l0eSwgY29sb3IgPSBgRHJ1ZyBUeXBlYCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gImRvZGdlIikKCmdncGxvdGx5KHBsdCkgJT4lIGxheW91dChtYXJnaW4gPSBsaXN0KGIgPSA1MCwgbCA9IDYwLCByID0gMTAsIHQgPSA4MCkpCgoKYGBgCgoKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gMywgZmlnLndpZHRoID0gNH0KbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkoZ3JpZEV4dHJhKQoKI2ZpZy5oZWlnaHQgPSAyLCBmaWcud2lkdGggPSAzCgojc2VhdHRsZV9kcnVnc18xM18xNyA8LSBzZWF0dGxlX2RydWdzXzEzXzE3ICU+JQojICBtdXRhdGUoUl9kYXRlID0gZmxvb3JfZGF0ZShtZHlfaG1zKGBPY2N1cnJlZCBEYXRlIG9yIERhdGUgUmFuZ2UgU3RhcnRgLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR6ID0gIlBTVDhQRFQiKSwgImRheSIpKQoKI1NGX2RydWdzXzEzXzE3IDwtIFNGX2RydWdzXzEzXzE3ICU+JQojICBtdXRhdGUoUl9kYXRlID0gbWR5KERhdGUsIHR6ID0gIlBTVDhQRFQiKSkKCnNlYXR0bGVfc2VsZWN0ZWRfZHJ1Z3MgPC0gc2VhdHRsZV9kcnVnc18xM18xNyAlPiUKICBmaWx0ZXIoYERydWcgVHlwZWAgJWluJSBjKCJNYXJpanVhbmEiLCAiQ29jYWluZSIsICJNZXRoYW1waGV0YW1pbmUiLCAiSGVyb2luIikpCgpTRl9zZWxlY3RlZF9kcnVncyA8LSBTRl9kcnVnc18xM18xNyAlPiUKICBmaWx0ZXIoYERydWcgVHlwZWAgJWluJSBjKCJNYXJpanVhbmEiLCAiQ29jYWluZSIsICJNZXRoYW1waGV0YW1pbmUiLCAiSGVyb2luIikpCgpudW1iZXJfb2ZfYmlucyA8LSA3OAoKcGx0X3NlYXR0bGVfc2VsZWN0ZWRfZHJ1Z3MgPC0gZ2dwbG90KHNlYXR0bGVfc2VsZWN0ZWRfZHJ1Z3MpICsgCiAgZ2VvbV9mcmVxcG9seShhZXMoeCA9IFJfZGF0ZSwgY29sb3IgPSBgRHJ1ZyBUeXBlYCksIGJpbnMgPSBudW1iZXJfb2ZfYmlucykgKwogIHNjYWxlX3hfZGF0ZXRpbWUoZGF0ZV9icmVha3MgPSAiNCBtb250aHMiLCAKICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoYXMuUE9TSVhjdCgiMjAxMi8xMi8zMSIsIHR6ID0gIlBTVDhQRFQiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLlBPU0lYY3QoIjIwMTgvMDEvMDEiLCB0eiA9ICJQU1Q4UERUIikpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh5ID0gIm51bWJlciBwZXIgZm9ydG5pZ2h0IiwgeCA9ICIiLAogICAgICAgdGl0bGUgPSAiU2VhdHRsZSBQb2xpY2UgSW5jaWRlbnRzIFJlbGF0ZWQgdG8gNCBQb3B1bGFyIERydWdzIiwKICAgICAgIGNvbG9yID0gIkRydWc6ICIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSkgKwogIGd1aWRlcyhzaXplID0gZ3VpZGVfbGVnZW5kKG9yZGVyID0gMikpCgpwbHRfU0Zfc2VsZWN0ZWRfZHJ1Z3MgPC0gZ2dwbG90KFNGX3NlbGVjdGVkX2RydWdzKSArCiAgZ2VvbV9mcmVxcG9seShhZXMoeCA9IFJfZGF0ZSwgY29sb3IgPSBgRHJ1ZyBUeXBlYCksIGJpbnMgPSBudW1iZXJfb2ZfYmlucykgKwogIHNjYWxlX3hfZGF0ZXRpbWUoZGF0ZV9icmVha3MgPSAiNCBtb250aHMiLCAKICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoYXMuUE9TSVhjdCgiMjAxMi8xMi8zMSIsIHR6ID0gIlBTVDhQRFQiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLlBPU0lYY3QoIjIwMTgvMDEvMDEiLCB0eiA9ICJQU1Q4UERUIikpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh5ID0gIm51bWJlciBwZXIgZm9ydG5pZ2h0IiwgeCA9ICIiLAogICAgICAgdGl0bGUgPSAiU2FuIEZyYW5jaXNjbyBQb2xpY2UgSW5jaWRlbnRzIFJlbGF0ZWQgdG8gNCBQb3B1bGFyIERydWdzIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSkKCnBsdF9zZWF0dGxlX2FsbF8xM18xNyA8LSBzZWF0dGxlX2NvbXBsZXRlICU+JSAKICBmaWx0ZXIoWWVhciAlaW4lIDIwMTM6MjAxNykgJT4lCiAgZ2dwbG90KGFlcyh4ID0gUl9kYXRlKSkgKyBnZW9tX2ZyZXFwb2x5KGJpbnMgPSBudW1iZXJfb2ZfYmlucykgKwogIHNjYWxlX3hfZGF0ZXRpbWUoZGF0ZV9icmVha3MgPSAiNCBtb250aHMiLCAKICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoYXMuUE9TSVhjdCgiMjAxMi8xMi8zMSIsIHR6ID0gIlBTVDhQRFQiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLlBPU0lYY3QoIjIwMTgvMDEvMDEiLCB0eiA9ICJQU1Q4UERUIikpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh5ID0gIm51bWJlciBwZXIgZm9ydG5pZ2h0IiwgeCA9ICIiLAogICAgICAgdGl0bGUgPSAiU2VhdHRsZSBQb2xpY2UgSW5jaWRlbnRzOiAyMDEzIHRocm91Z2ggMjAxNyIpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSkKCnBsdF9TRl9hbGxfMTNfMTcgPC0gU0ZfY29tcGxldGUgJT4lCiAgZmlsdGVyKFllYXIgJWluJSAyMDEzOjIwMTcpICU+JQogIGdncGxvdChhZXMoeCA9IFJfZGF0ZSkpICsgZ2VvbV9mcmVxcG9seShiaW5zID0gbnVtYmVyX29mX2JpbnMpICsKICBzY2FsZV94X2RhdGV0aW1lKGRhdGVfYnJlYWtzID0gIjQgbW9udGhzIiwgCiAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKGFzLlBPU0lYY3QoIjIwMTIvMTIvMzEiLCB0eiA9ICJQU1Q4UERUIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5QT1NJWGN0KCIyMDE4LzAxLzAxIiwgdHogPSAiUFNUOFBEVCIpKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnMoeSA9ICJudW1iZXIgcGVyIGZvcnRuaWdodCIsIHggPSAiIiwKICAgICAgIHRpdGxlID0gIlNhbiBGcmFuY2lzY28gUG9saWNlIEluY2lkZW50czogMjAxMyB0aHJvdWdoIDIwMTciKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gOSksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpCgpncmlkLmFycmFuZ2UocGx0X3NlYXR0bGVfYWxsXzEzXzE3LCBwbHRfU0ZfYWxsXzEzXzE3LCAKICAgICAgICAgICAgIHBsdF9TRl9zZWxlY3RlZF9kcnVncywgcGx0X3NlYXR0bGVfc2VsZWN0ZWRfZHJ1Z3MsICAKICAgICAgICAgICAgIGxheW91dF9tYXRyaXggPSByYmluZChjKDEsIDIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoNCwgMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyg0LCBOQSkpLAogICAgICAgICAgICAgaGVpZ2h0cyA9IGMoNSwgNSwgMSkpCiAgICAgICAgICAgICAKYGBgCgoKCgoK